package com.properties;

import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

/**
 * 获取所有的配置。
 * 
 * @author emmerich@126.com
 * @createDate 2014年7月28日
 *
 */
public class PropertiesManager {

    private static String APPLICATION_PATH = "src/main/resources/application.conf";
    
    private static volatile boolean HAS_INIT = Boolean.FALSE;
    
    /**
     *  线程为了提高效率，将某成员变量(如A)拷贝了一份（如B），线程中对A的访问其实访问的是B。
     *  只在某些动作时才进行A和B的同步。因此存在A和B不一致的情况。volatile就是用来避免这种情况的。
     */
    private static volatile Map<String, String> properties = new HashMap<String, String>();
    
    private static volatile PropertiesManager instance=null;
    
    private PropertiesManager(){
        if(!HAS_INIT){
            Properties pro = new Properties();
            InputStream in = this.getClass().getClassLoader().getResourceAsStream(
                    APPLICATION_PATH);
            try {
                pro.load(in);
            } catch (IOException e) {
                com.log.Log.error(e, e.getMessage());
            }
            
            for(Object key: pro.keySet()){
                properties.put(key.toString(), pro.get(key).toString());
            }
            
            HAS_INIT=Boolean.TRUE;  
        }
    }
    
    public static synchronized PropertiesManager instance() {
        if(instance==null){
            instance = new PropertiesManager();
        }
        return instance;
    }
    
    public String getValue(String key){
        return properties.get(key);
    }
}
